package com.junjiao.util.java;

import java.util.HashSet;
import java.util.Set;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import org.apache.commons.lang.StringUtils;

/**
 * 拼音转换工具类
 * @description:   <br>
 * @author:jiaojun
 * @email:junjiao.j@gmail.com
 * @project:jiaojun_util
 * @version:v0.2
 * @date:2013-6-19
 */
public class PinyinUtil {
	/**
	 * 得到输入字符串的大写PINYIN字符串。
	 * 多音字:"长"为"CHANG"
	 * @param inputString
	 * @return
	 */
	public static String getPinYin(String inputString) {
		HanyuPinyinOutputFormat format =new HanyuPinyinOutputFormat();
		format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		format.setVCharType(HanyuPinyinVCharType.WITH_V);

		char[] input = inputString.trim().replace("长", "CHANG").toCharArray();
		String output ="";

		try{
			for(int i =0; i < input.length; i++) {
				if(Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i],format);
					output += temp[0];
				}else
					output += Character.toString(input[i]);
			}
		}catch(BadHanyuPinyinOutputFormatCombination e) {
			e.printStackTrace();
		}
		return output;
	}
	
	public static String getFisrtUp(String inputSring){
		String first = getPinYin(inputSring);
		if(StringUtils.isNotBlank(first)&&first.length()>0){
			return first.substring(0,1);
		}
		return "";
	}
	
	/** 
	  * 字符串集合转换字符串(逗号分隔) 
	  * @author wyh 
	  * @param stringSet 
	  * @return 
	  */  
	 public static String makeStringByStringSet(Set<String> stringSet){  
	  StringBuilder str = new StringBuilder();  
	  int i=0;  
	  for(String s : stringSet){  
	   if(i == stringSet.size() - 1){  
	    str.append(s);  
	   }else{  
	    str.append(s + ",");  
	   }  
	   i++;  
	  }  
	  return str.toString().toLowerCase();  
	 }  
	   
	 /** 
	  * 获取拼音集合 
	  * @author wyh 
	  * @param src 
	  * @return Set<String> 
	  */  
	 public static Set<String> getPinyin(String src){  
	  if(src!=null && !src.trim().equalsIgnoreCase("")){  
	   char[] srcChar ;  
	   srcChar=src.toCharArray();  
	   //汉语拼音格式输出类  
	   HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();  
	  
	//输出设置，大小写，音标方式等  
	   hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);   
	   hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE) ; 
	   hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);  
	     
	   String[][] temp = new String[src.length()][];  
	   for(int i=0;i<srcChar.length;i++){  
	    char c = srcChar[i];  
	    //是中文或者a-z或者A-Z转换拼音(我的需求，是保留中文或者a-z或者A-Z)  
	    if(String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")){  
	     try{  
	      temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i], hanYuPinOutputFormat);  
	     }catch(BadHanyuPinyinOutputFormatCombination e) {  
	      e.printStackTrace();  
	     }  
	    }else if(((int)c>=65 && (int)c<=90) || ((int)c>=97 && (int)c<=122)){  
	     temp[i] = new String[]{String.valueOf(srcChar[i])};  
	    }else{  
	     temp[i] = new String[]{""};  
	    }  
	   }  
	   String[] pingyinArray = Exchange(temp);  
	   Set<String> pinyinSet = new HashSet<String>();  
	   for(int i=0;i<pingyinArray.length;i++){  
	    pinyinSet.add(pingyinArray[i]);  
	   }  
	   return pinyinSet;  
	  }  
	  return null;  
	 }  
	   
	 /** 
	  * 递归 
	  * @author wyh 
	  * @param strJaggedArray 
	  * @return 
	  */  
	    public static String[] Exchange(String[][] strJaggedArray){  
	        String[][] temp = DoExchange(strJaggedArray);  
	        return temp[0];         
	    }  
	     
	    /** 
	     * 递归 
	     * @author wyh 
	     * @param strJaggedArray 
	     * @return 
	     */  
	    private static String[][] DoExchange(String[][] strJaggedArray){  
	        int len = strJaggedArray.length;  
	        if(len >= 2){             
	            int len1 = strJaggedArray[0].length;  
	            int len2 = strJaggedArray[1].length;  
	            int newlen = len1*len2;  
	            String[] temp = new String[newlen];  
	            int Index = 0;  
	            for(int i=0;i<len1;i++){  
	                for(int j=0;j<len2;j++){  
	                    temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];  
	                    Index ++;  
	                }  
	            }  
	            String[][] newArray = new String[len-1][];  
	            for(int i=2;i<len;i++){  
	                newArray[i-1] = strJaggedArray[i];                             
	            }  
	            newArray[0] = temp;  
	            return DoExchange(newArray);  
	        }else{  
	         return strJaggedArray;     
	        }  
	    }  
	     
	 /** 
	  * @param args 
	  */  
	 public static void main(String[] args) {  
	  String str = "单田芳";  
	  System.out.println(makeStringByStringSet(getPinyin(str)));  
	  System.out.println(getPinYin("你好，可爱的世界"));
	  
	}  
}
